前兩天在戍衛京師周邊的任務中,我們分別使用雜湊(hash)和加密(encrypt)來保護特定資料表下的敏感性欄位,今天從另外一個儲存層面想,如果想避免資料庫伺服器中的DB實體檔案(.bak、.mdf、.ndf、.ldf)被不明原因攜出後迅速外洩,在資料庫層級可以考慮使用SQL Server 2008推出的TDE(Transparent Data Encryption),中文是透明資料加密。
透明資料的加密是屬於資料庫層級(Database level)的保護,主要在Data及Log Page層的I/O執行加密, SQL Server會在Page Buffer flush到硬碟前加密;從磁碟讀取資料時,Database Engine也會在讀取到記憶體(data buffer)時進行解密。
透明資料加密是企業版本(Enterprise Edition)以上的功能,雖然我們從AP層面(ADO.NET,SSMS,Sqlcmd)都能清澈的看到資料,但實體磁碟儲存及tempdb都是加密後的狀態,維護著一定的機密性。
在執行透明資料加密前,我們先把資料庫備份。
BACKUP DATABASE [SecurityDB] TO  DISK = N'D:\backup\SecurityDB_ORIG.bak' 
WITH NOFORMAT, NOINIT,  
NAME = N'SecurityDB-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, COMPRESSION,  STATS = 10
GO
--1.建立MASTER KEY 
use master  
create master key encryption by 
password= 'imMKpassword1' 
go 
 
--2.建立憑證 
use master  
create certificate [Cert] 
with subject = 'Instance層級測試憑證' 
建立資料庫加密金鑰,這邊選擇AES256演算法,最後啟用資料庫SecurityDB的加密功能。
--3.建立資料庫加密金鑰 
use [SecurityDB] 
create database encryption key 
with algorithm=AES_256 
encryption by server certificate [Cert] 
 
--4.啟用資料庫加密 
alter database [SecurityDB] 
set encryption on 

偷偷搬來本機:

試試看附加.mdf資料庫實體檔案!

附加失敗!表示實體檔案初步防護成功。
試試看還原資料庫備份,先備份資料庫
BACKUP DATABASE [SecurityDB] TO  DISK = N'D:\Backup\SecurityDB.bak'  
WITH NOFORMAT, NOINIT,  NAME = N'SecurityDB-完整 資料庫 備份',  
SKIP, NOREWIND, NOUNLOAD,  STATS = 10 
GO 
還原資料庫:

失敗!在備份檔案(.bak)的初步防護也成功。
優點
缺點
啟用透明資料前後備份(.bak)檔案
透明資料加密 (TDE)
https://msdn.microsoft.com/zh-tw/library/bb934049.aspx
義大利米蘭市女警
2011.10 攝於Milano,italy